home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / dirent.lha / dirent / opendir.c < prev    next >
C/C++ Source or Header  |  1988-09-02  |  2KB  |  77 lines

  1. /*
  2.     opendir -- open a directory stream
  3.  
  4.     last edit:    25-Apr-1987    D A Gwyn
  5. */
  6.  
  7. #ifdef unos
  8. #include    <errno.h>
  9. #else
  10. #include    <sys/errno.h>
  11. #endif
  12. #include    <sys/types.h>
  13. #include    <sys/stat.h>
  14. #include    <dirent.h>
  15.  
  16. #ifdef BRL
  17. #define open    _open            /* avoid emulation overhead */
  18. #endif
  19.  
  20. typedef char    *pointer;        /* (void *) if you have it */
  21.  
  22. extern void    free();
  23. extern pointer    malloc();
  24. extern int    open(), close(), fstat();
  25.  
  26. extern int    errno;
  27.  
  28. #ifndef NULL
  29. #define    NULL    0
  30. #endif
  31.  
  32. #ifndef O_RDONLY
  33. #define    O_RDONLY    0
  34. #endif
  35.  
  36. #ifndef S_ISDIR                /* macro to test for directory file */
  37. #define    S_ISDIR( mode )        (((mode) & S_IFMT) == S_IFDIR)
  38. #endif
  39.  
  40. DIR *
  41. opendir( dirname )
  42.     char        *dirname;    /* name of directory */
  43. {
  44.     register DIR    *dirp;        /* -> malloc'ed storage */
  45.     register int    fd;        /* file descriptor for read */
  46.     struct stat    sbuf;        /* result of fstat() */
  47.  
  48.     if ( (fd = open( dirname, O_RDONLY )) < 0 )
  49.         return NULL;        /* errno set by open() */
  50.  
  51.     if ( fstat( fd, &sbuf ) != 0 || !S_ISDIR( sbuf.st_mode ) )
  52.         {
  53.         (void)close( fd );
  54.         errno = ENOTDIR;
  55.         return NULL;        /* not a directory */
  56.         }
  57.  
  58.     if ( (dirp = (DIR *)malloc( sizeof(DIR) )) == NULL
  59.       || (dirp->dd_buf = (char *)malloc( (unsigned)DIRBUF )) == NULL
  60.        )    {
  61.         register int    serrno = errno;
  62.                     /* errno set to ENOMEM by sbrk() */
  63.  
  64.         if ( dirp != NULL )
  65.             free( (pointer)dirp );
  66.  
  67.         (void)close( fd );
  68.         errno = serrno;
  69.         return NULL;        /* not enough memory */
  70.         }
  71.  
  72.     dirp->dd_fd = fd;
  73.     dirp->dd_loc = dirp->dd_size = 0;    /* refill needed */
  74.  
  75.     return dirp;
  76. }
  77.